#include "BlockQueue.hpp"
#include "Task.hpp"

void* consumerrun(void* args)
{
    BlockQueue<task_t>* bq = static_cast<BlockQueue<task_t>* >(args);
    while(true)
    {
        // int data = bq->pop();
        task_t t = bq->pop();
        std::cout << "消费者消费了一个任务" << std::endl;
        t();
    }
}

void* productorrun(void* args)
{
    int data=1;
    BlockQueue<task_t>* bq = static_cast<BlockQueue<task_t>* >(args);
    while(true)
    {
        // bq->EnterQueue()
        // std::cout << "消费者消费了一个任务" << std::endl;
        // bq->pop();
        // sleep(1);
        // bq->EnterQueue(data);
        sleep(1);
        std::cout << "生产了一个任务" << std::endl;
        // bq->EnterQueue(1);


        // data++;

        bq->EnterQueue(download);
        // bq->EnterQueue(upload);
    }
}

int main()
{
    BlockQueue<task_t>* bq = new BlockQueue<task_t>();
    pthread_t consumer[2],productor[3];

    pthread_create(consumer,nullptr,consumerrun,bq);
    pthread_create(consumer + 1,nullptr,consumerrun,bq);

    pthread_create(productor,nullptr,productorrun,bq);
    pthread_create(productor + 1,nullptr,productorrun,bq);
    pthread_create(productor + 2,nullptr,productorrun,bq);


    pthread_join(consumer[0],nullptr);
    pthread_join(consumer[1],nullptr);

    pthread_join(productor[0],nullptr);
    pthread_join(productor[1],nullptr);
    pthread_join(productor[2],nullptr);

}


// void* consumerrun(void* args)
// {
//     BlockQueue<Task>* bq = static_cast<BlockQueue<Task>* >(args);
//     while(true)
//     {
        
//         Task t = bq->pop();        
//         t.Execute();
//         std::cout << "消费者消费了一个任务" << t.getX() << "+" << t.getY() << "=" << t.result() << std::endl;
        
//     }
// }

// void* productorrun(void* args)
// {
//     int x = 1, y = 1;
//     BlockQueue<Task>* bq = static_cast<BlockQueue<Task>* >(args);
//     while(true)
//     {
//         sleep(1);
//         std::cout << "生产了一个任务" << x << "+" << y << "=" << x + y <<std::endl;
//         Task t(x,y);
//         bq->EnterQueue(t);
//         x++,y++;
//     }
// }


// int main()
// {
//     BlockQueue<Task>* bq = new BlockQueue<Task>();
//     pthread_t consumer,productor;

//     pthread_create(&consumer,nullptr,consumerrun,bq);
//     pthread_create(&productor,nullptr,productorrun,bq);


//     pthread_join(consumer,nullptr);
//     pthread_join(productor,nullptr);
// }
// int main()
// {
//     BlockQueue<int>* bq = new BlockQueue<int>();
//     pthread_t consumer,productor;

//     pthread_create(&consumer,nullptr,consumerrun,bq);
//     pthread_create(&productor,nullptr,productorrun,bq);


//     pthread_join(consumer,nullptr);
//     pthread_join(productor,nullptr);

//     return 0;
// }